package bislider;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.text.DecimalFormat;
import java.util.Vector;

import javax.swing.JPopupMenu;

import com.visutools.nav.bislider.*;

/**
 * Classe de création d'une bislider, avec des options pré-sélectionnées en fonction de nos besoins
 * pour faciliter son utilisation.
 * @author Spillane - Roger - Burgert - Cadoret
 * @see https://bislider.dev.java.net/ (de Frédéric Vernier)
 * @version 1.5
 */
public class MyBiSlider extends BiSlider { 
	private MyBiSlider instance;
	// valeur max rencontré dans le tableau de valeur
    public int MaxValueInfos = 15;
    // tableau de valeurs, chaque indice représente une hauteur de la colonne
    public Vector<Integer> SliderInfos;

    /**
     * Constructeur par défaut
     */
    public MyBiSlider() {
    	super();
    	SliderInfos = new Vector<Integer>();
    }
    
    /**
     * Constructeur qui initialise la bislider à partir du vector de données passé en paramètre.
     * @param infos	l'incide i contient le nombre de chansons de l'année i (par exemple)
     */
    public MyBiSlider(Vector<Integer> infos) {
    	super(BiSlider.CENTRAL);
    	SliderInfos = new Vector<Integer>();
    	setMaxValue(infos);
	    this.setToolTipText("Répartion des chansons selon leur date");
	    this.setUniformSegment(true);
	    this.setVisible(true);
	    this.setMinimumValue(1);
	    this.setMaximumValue(10);
	    this.setSegmentSize(1);
	    this.setDecimalFormater(new DecimalFormat("0;10"));
	    this.setMinimumColor(Color.BLUE);
	    this.setMaximumColor(Color.RED);
	    this.setColoredValues(0, infos.size());
	    this.setUnit("");
	    this.setPrecise(true);
	    this.setSound(false);
	    this.setArcSize(18);
	    this.setIntSegments(true);
	    this.setIntValues(true);
	    
	    instance = this;
	    
	    this.addContentPainterListener(new ContentPainterListener() {
	        public void paint(ContentPainterEvent event){
	          Graphics2D Graphics2 = (Graphics2D)event.getGraphics();
	          Rectangle Rect2 = event.getBoundingRectangle();
	          
	          double BarHeight, BarHeight2;
	          int index = event.getSegmentIndex();
	          refreshMaxValue();
	          // System.out.println("MaxValue : " + MaxValueInfos);
	          
	          BarHeight = 0;
	          int inter = (int)instance.getSegmentSize();
	          for (int i = index * inter; (i < index * inter + inter) && (i < SliderInfos.size()); i++) {
	        	  BarHeight += SliderInfos.elementAt(i);
	          }
	          BarHeight /= (float)MaxValueInfos;
	          if ((index-1 > 0) && (index < 10)) {
	        	  index -= 1;
	        	  BarHeight2 = 0;
	        	  for (int i = index * inter; (i < index * inter + inter) && (i < SliderInfos.size()); i++) {
		        	  BarHeight2 += SliderInfos.elementAt(i);
		          }
	        	  BarHeight2 /= (float)MaxValueInfos;
	          }
	          else 
	        	  BarHeight2 = BarHeight;
	          
	          if (event.getColor()!=null) {
	        	  Graphics2.setColor(event.getColor());
	        	  Graphics2.fillRect(Rect2.x, Rect2.y+(int)(((1-BarHeight)*Rect2.height)), Rect2.width+1, 1+(int)((BarHeight*Rect2.height)));
	          } else {
	        	  Graphics2.setColor(new Color(255, 255, 218, 64));
	        	  Graphics2.fillRect(Rect2.x, Rect2.y+(int)(((1-BarHeight)*Rect2.height)), Rect2.width+1, 1+(int)((BarHeight*Rect2.height)));
	          }
	          Graphics2.setColor(Color.BLACK);
	          Graphics2.drawLine(Rect2.x, Rect2.y+(int)(((1-BarHeight)*Rect2.height)), Rect2.x+Rect2.width-1, Rect2.y+(int)(((1-BarHeight)*Rect2.height)));
	          Graphics2.drawLine(Rect2.x, Rect2.y+(int)(((1-Math.max(BarHeight, BarHeight2))*Rect2.height)), Rect2.x, Rect2.y+Rect2.height);
	        }
	    });
	    
	    final JPopupMenu JPopupMenu = this.createPopupMenu();
	    this.addMouseListener(new MouseAdapter(){
	        @Override
	        public void mousePressed(MouseEvent MouseEvent_Arg){
	          if (MouseEvent_Arg.getButton()==MouseEvent.BUTTON3){
	            JPopupMenu.show(instance, MouseEvent_Arg.getX(), MouseEvent_Arg.getY());
	          }
	        }
	    });
	    

    }
    
    /**
     * Recherche la valeur maximum contenue dans le vector
     * @param infos
     */
    private void setMaxValue(Vector<Integer> infos) {
    	SliderInfos = infos;
    	MaxValueInfos = 0;
    	for (Integer i : infos) {
    		if (i > MaxValueInfos)
    			MaxValueInfos = i;
    	}
    }
    
    /**
     * Recalcul la valeur maximum contenue dans le vector "SliderInfos".
     * Ici nous prenons en compte la taille "segSize" d'un segment de la bislider, si cette
     * taille englobe plusieurs colonnes du vector, la méthode parcourt le vector par intervalle
     * de "segSize" et retourne la valeur maximum.
     */
    private void refreshMaxValue() {
    	int inter = (int)instance.getSegmentSize();
    	int i = 0, val;
    	
    	if (inter != 0) {
    		MaxValueInfos = 0;
	    	while (i < SliderInfos.size()) {
	    		val = 0;
	    		int j = 0;
	    		while ((j < inter) && (i+j < SliderInfos.size())) {
	    			val += SliderInfos.elementAt(i + j);
	    			j++;
	    		}
	    		i += j;
	    		if (val > MaxValueInfos)
	    			MaxValueInfos = val;
	    	}
    	}
    }
    
}
